package feeinterface.protocol.req;

import org.apache.log4j.Logger;
import com.ulwx.tool.StringUtils;
import feeinterface.dao.BaseGetPhoneFromWapDao;
import feeinterface.dao.BaseImsiPhoneDao;
import feeinterface.dao.BaseSmsModemPortDao;
import feeinterface.dao.BaseSmsModemSelectTestDao;
import feeinterface.dao.BaseThirdPartyURLDao;
import feeinterface.dao.MobileExtDao;
import feeinterface.modeldb.BaseGetPhoneFromWap;
import feeinterface.modeldb.BaseImsiPhone;
import feeinterface.modeldb.BaseSmsModemPort;
import feeinterface.modeldb.BaseThirdPartyURL;
import feeinterface.modeldb.MobileExt;
import feeinterface.protocol.res.OperStep;
import feeinterface.protocol.res.Res010005;
import feeinterface.protocol.utils.Constants;
import feeinterface.utils.PhoneUtils;
import feeinterface.utils.URLConfig;

/**
 * 2.5 获取手机号码协议（010005） 请求URL ：http://<ip>:<port>/interface/exchange
 * 
 * @author 黄杰
 * 
 */
public class Pro010005 extends ProExchange {

	private  static  Logger log = Logger.getLogger(Pro010005.class); // 跟类名一样

	@Override
	public Object genBean() throws Exception {
		/**
		 * 
		 */
		Res010005 res = new Res010005();
		// 初始化响应资源
		this.init(res);
		// 该IMSI对应手机号码已存在！
		this.IMSI = StringUtils.trim(this.IMSI);
		if (this.IMSI != null && this.IMSI.length() == 15
				&& "460".equals(this.IMSI.substring(0, 3))) {
			// IMSI正确，判断表中是否有手机号码，如果有，则不再获取。
			BaseImsiPhone bi = BaseImsiPhoneDao.getPhoneBy(IMSI);
			if (bi != null) {
				log.info("该IMSI对应手机号码已存在！");
				res.Mobile = bi.getPhone();
				return res;
			}
		}
		// 判断是否为绑定，如果是，则返回绑定的号码，2011-11-1
		try {
			res.SMSCatPort = BaseSmsModemSelectTestDao
					.getSmsPortPhone(this.COID);
		} catch (Exception ex) {
			res.SMSCatPort = "";
			log.error("获取短信端口号出错！", ex);
		}
		if (StringUtils.hasText(res.SMSCatPort)
				&& res.SMSCatPort.length() == 11) {
			res.SMSContent = IMSI;
			return res;
		}
		// 判断是否超过获取号码的日限和月限
		MobileExt met = null;
		try {
			met = MobileExtDao.getByIMSI(IMSI);
			if (met != null) {
				if (met.getDayGetPhoneCnt() > Constants.MobileLimit.PhoneGetDayMax
						|| met.getMonthGetPhoneCnt() > Constants.MobileLimit.PhoneGetMonthMax) {
					res.Status = Constants.Status.FAIL;
					res.Message = "用户已经超过获取号码的日限或月限";
					return res;
				}
			}
		} catch (Exception e) {
			log.error("获取用户出错！", e);
		}
		
		
		String carrier="";
		if(StringUtils.hasText(this.SmsCenter)){			
			String newSmsCenter = PhoneUtils.getAdjustedPhone(this.SmsCenter);
			carrier = PhoneUtils.getCarrierFromPhone(newSmsCenter);	
		}
		//修改： 2012-02-09 孙超进 因为只有移动使用GD业务取号的方式
		if ("移动".equals(carrier)) {
			// wap截取方式
			BaseGetPhoneFromWap pfWap = BaseGetPhoneFromWapDao
					.getPhoneFromWap();
			if (pfWap != null) {
				if ( pfWap.getStartURL() != null) {
					res.GetMobilePageUrl = pfWap.getStartURL();
				}else{
					res.GetMobilePageUrl="";
				}
				res.GetMobileStep = this.analyse(pfWap.getFetchKeyStr());
			} else {
				res.GetMobilePageUrl = "";
			}
		} else {
			res.GetMobilePageUrl = "";
		}
		// 判断是否有第三方取号码的URL
		BaseThirdPartyURL url = BaseThirdPartyURLDao.getThirdPartyUrl();
		if (url != null) {
			log.debug("有第三方取用户手机号码的URL");
			res.ThirdPartyUrl = url.getThirdPartyUrl() + "";
			// 拼装回调URL，此url为我们提供给第三方的url地址，第三方通过此地址赋予手机号码
			String callBackURL = URLConfig.ROOT + "?var=<Protocol>_<IMSI>_<ExtVar>_<ThirdPartyUrlID>";
			callBackURL = callBackURL.replace("<Protocol>", "010006");
			callBackURL = callBackURL.replace("<IMSI>", IMSI);
			callBackURL = callBackURL.replace("<ExtVar>", "");
			callBackURL = callBackURL.replace("<ThirdPartyUrlID>",url.getBsThirdPartyURLSno() + "");
			String thirdPartyURL = url.getThirdPartyUrl();
			res.ThirdPartyUrl = thirdPartyURL.replace("<CallBackURL>",callBackURL);
		} else {
			res.ThirdPartyUrl = "";
		}

		// 判断是否有接收的手机号码
		BaseSmsModemPort smsPort = BaseSmsModemPortDao.getSmsPort();
		if (smsPort != null) {
			res.SMSCatPort = smsPort.getSmsPort() + "";
		}
		if (res.SMSCatPort.length() > 1) {
			res.SMSContent = IMSI;
		}
		
		if ("".equals(res.GetMobilePageUrl) && "".equals(res.SMSCatPort)
				&& "".equals(res.ThirdPartyUrl)) {
			res.Status = Constants.Status.FAIL;
			res.Message = "失败";
			log.debug("获取间接获得手机地址方式失败！");
		}
		return res;
	}

	/**
	 * 对响应值初始化
	 * 
	 * @param res
	 */
	public void init(Res010005 res) {
		res.Status = Constants.Status.SUCCESS;
		res.Message = "成功";
		res.Mobile = "";
		res.GetMobilePageUrl = "";
		res.ThirdPartyUrl = "";
		res.SMSCatPort = "";
		res.SMSContent = "";
	}

	/**
	 * 解析抓取步骤
	 * 
	 * @param fetchStep
	 * @return
	 */
	public OperStep[] analyse(String fetchWapStep) {
		OperStep fetStep[] = null;
		try {
			String wapStep[] = StringUtils.split(fetchWapStep, "=@=");
			if (wapStep != null && wapStep.length > 0) {
				fetStep = new OperStep[wapStep.length];
				for (int i = 0; i < wapStep.length; i++) {
					String key[] = StringUtils.split(wapStep[i], "@@");
					fetStep[i] = new OperStep();
					fetStep[i].FindKeys = key[0];
					fetStep[i].EndKey = key[1];
				}
			}
		} catch (Exception e) {
			fetStep = null;
		}
		return fetStep;
	}

	/**
	 * 如果返回NULL表示验证成功
	 */
	@Override
	public String validate() throws Exception {
		if (StringUtils.isEmpty(this.IMSI)) {
			IMSI = "";
		}
		if (this.PacketID == null) {
			return "网络繁忙，请重新登录再试!";
		}
		return null;
	}

	/**
	 * 包id
	 */
	public String PacketID;
	/**
	 * 手机卡串号
	 */
	public String IMSI;
	/**
	 * 版本号id，函数库的版本号
	 */
	public Integer Ver;
	/**
	 * 平台简称
	 */
	public String Platform;
	/**
	 * 短信中心号码，允许为空
	 */
	public String SmsCenter;
	/**
	 * 虚拟机版本号
	 */
	public Integer VmVer;
	/**
	 * 合作业务ID，后台通过此id可以找到对应的产品，产品的概念：好玩吧 ，哈密瓜等
	 */
	public Integer COID;
	/**
	 * 1-请求本接口来自客户端，
	 * 2-请求本接口来自服务器,如果是来做客户端请求模式，则Carrier，GatewayIP，GatewayKW为空字符串,
	 * 如果是服务器请求模式，则Carrier，GatewayIP，GatewayKW必须填
	 * 
	 * @see SysEnum.RequestFrom
	 */
	public Integer RequestFrom;
	/**
	 * 运营商,1:移动，2:联通，3:网通，4:电信，5:铁通; 此参数RequestFrom=2时使用，由业务服务器调用计费中心使用，
	 * 当RequestFrom=1时，不用提交此参数
	 * 
	 * @see SysEnum.Carrier
	 */
	public Integer Carrier;
	/**
	 * WAP网关IP，如果是由合作方后台访问需要将客户端的WAP网关IP送过来作判断，来源于REMOTE_ADDR参数,
	 * 此参数RequestFrom=2时使用，由业务服务器调用计费中心使用， 当RequestFrom=1时，不用提交此参数
	 */
	public String GatewayIP;
	/**
	 * WAP网关特征字，如果是由合作方后台访问本接口需要将客户端的WAP网关特征字送过来作判断，来源于HTTP_VIA参数,
	 * 此参数RequestFrom=2时使用，由业务服务器调用计费中心使用
	 */
	public String GatewayKW;

	/**
	 * 无参构造函数
	 */
	public Pro010005() {
		this.Protocol = "010005";
	}

}
